package com.hyw.encryption.provider.extractor.http;

import org.springframework.http.HttpHeaders;
import org.springframework.util.StringUtils;

import com.hyw.encryption.provider.extractor.IDecryptKeyExtract;
import com.hyw.encryption.provider.extractor.IEncryptKeyExtract;

/**
 * 提供一个场景样例，基于HTTP请求头中，获取特定的用户标记，比如字段名uid。
 * <p>
 * 大多数情况下，可以直接从用户讲求头中获取关联key，但有一些情况可能无法获得，或者是获得的是不正确的。
 * <p>
 * etc. 有一些系统，是支持游客标记和正式用户标记的，这种情况下，当一个游客在转换成正式用户时，会发现转换前的用户ID是游客ID。<br>
 * 故业务上需要把当前登陆成功的用户ID当成真正的用户标记，而不能简单的以请求时的请求头uid为凭证了。 <br>
 * 为了迎合这种情况，引入一个HttpHeaderUidContext这么个临时存储区域，让业务上把真正的uid放进去。同时在获取key操作时，会优先检查HttpHeaderUidContext中的数据。
 * 
 * @author Hongyu
 */
public class HttpHeaderKeyExtractor implements IDecryptKeyExtract<HttpHeaders>, IEncryptKeyExtract<HttpHeaders> {

  @Override
  public String extract(HttpHeaders context, String key) {
    String ret = HttpHeaderUidContext.get();
    if (StringUtils.isEmpty(ret)) {
      ret = context.getFirst(key);
    }
    return ret;
  }

}
